package psico_test.utils.xml;

import java.io.File;
import java.util.List;
import java.util.Vector;

import javax.swing.JOptionPane;
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

import psico_test.utils.file.FileManager;

public class XMLManager 
{
	private static XMLManager instance;
	static String [] atributos = {"color","texto","sonido","tiempo"};

	private XMLManager()
	{}

	public static XMLManager getInstance()
	{
		if(instance==null)
			instance = new XMLManager();
		return instance;
	}

	public synchronized  Vector leerExperimentoXML(File archivoXML) 
	{
		Vector elementos = null; 
		try 
		{
			SAXBuilder builder=new SAXBuilder(false); 
			Document doc=builder.build(archivoXML.getAbsolutePath());

			Element EtiquetaRaiz = doc.getRootElement();
			List aux = EtiquetaRaiz.getChildren();

			elementos = new Vector();
			for(int i=0; i<aux.size(); i++)
				elementos.add(aux.get(i));

		}catch (Exception e)
		{
			JOptionPane.showMessageDialog(null,"Error en la lectura " +
					"del fichero XML\nFormato de archivo no compatible\n" +
					"Error: "+e.hashCode(),"Archivo Erroneo",JOptionPane.WARNING_MESSAGE );
		}
		return elementos;
	}

	public synchronized boolean generarExperimentoXML(Vector tabla)
	{
		try
		{
			Element raiz=new Element("experiment");

			for(int i=0; i<tabla.size();i++)
			{
				Vector aux = (Vector) tabla.get(i);
				Element ensayo = new Element("trial");
				for(int j=0; j<aux.size(); j++)
				{
					ensayo.setAttribute(atributos[j],aux.get(j).toString());
				}
				raiz.addContent(ensayo);
			}

			Document doc = new Document(raiz);

			File f = FileManager.getInstance().guardarArchivo();
			if(f==null)
				return false;
			else
			{
				String path = f.getAbsolutePath();
				if(!path.endsWith(".xml"))
					path+=".xml";
				XMLOutputter out=new XMLOutputter(Format.getPrettyFormat());
				java.io.FileWriter writer = new java.io.FileWriter(path);
				out.output(doc, writer);
				writer.flush();
				writer.close();
				return true;
			}
		}catch(Exception e)
		{
			System.out.println("Error en XMLManager.generarExperimentoXML: "+e.getMessage());
			e.printStackTrace();
			return false;
		}
	}
	
	public synchronized Vector leerResultadoXML (File archivoXML)
	{
		
		return null;
	}
	
	public synchronized boolean generarResultadoXML(long [] resultados)
	{
		try
		{
			Calendar fecha = Calendar.getInstance();
			String date = fecha.DAY_OF_WEEK+"-"+fecha.MONTH+", "+fecha.HOUR+":"+fecha.MINUTE;
			Element raiz=new Element("Resultados");
			raiz.setAttribute("Date",date);
			for(int i=0; i<resultados.length;i+=2)
			{
				Element retardo = new Element("Result");
				
				if(resultados[i]>0)
				{
					retardo.setAttribute("Time","Pre-click");
				}
				else
				{
					long milis = resultados[i]/1000000;
					long nanos = resultados[i]%1000000;
					retardo.setAttribute("Time",Math.abs(milis)+", "+Math.abs(nanos));
				}
				long milis = resultados[i+1]/1000000;
				long nanos = resultados[i+1]%1000000;
				long segs = milis/1000;
				milis = milis%1000;
				
				retardo.setAttribute("ONset","seg:"+segs+" milis:"+milis+" nanos:"+nanos);
				raiz.addContent(retardo);
			}

			Document doc = new Document(raiz);

			File f = FileManager.getInstance().guardarArchivo();
			if(f==null)
				return false;
			else
			{
				String path = f.getAbsolutePath();
				if(!path.endsWith(".xml"))
					path+=".xml";
				XMLOutputter out=new XMLOutputter(Format.getPrettyFormat());
				java.io.FileWriter writer = new java.io.FileWriter(path);
				out.output(doc, writer);
				writer.flush();
				writer.close();
				return true;
			}
		}catch(Exception e)
		{
			System.out.println("Error en XMLManager.generarExperimentoXML: "+e.getMessage());
			e.printStackTrace();
			return false;
		}
	}
}